package com.example.yx.demo12;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyDemo {
    interface foo {
        void foo();
    }

    static class Target implements foo {

        @Override
        public void foo() {
            System.out.println("target foo");
        }
    }

    public static void main(String[] args) {
        //待增强的目标对象
        Target target = new Target();

        ClassLoader classLoader = JdkProxyDemo.class.getClassLoader();//用来加载在运行期间动态生成的字节码

        //创建代理对象，newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)，可以看出创建代理对象需要三个参数
        //1.一个用于在运行期间动态产生对象的类加载器
        //2.一组需要被代理的接口
        //3.InvocationHandler接口，用于生成特定的代理程序，从而实现代码增强，p是代理实例，method是需要代理的方法，args1是需要的参数
        foo proxy = (foo) Proxy.newProxyInstance(classLoader, new Class[]{foo.class}, (p, method, args1) -> {

            System.out.println("before");
            //方法.invoke(目标,参数)反射使用
            Object result = method.invoke(target, args);

            System.out.println("after..");
            return result;
        });

        proxy.foo();
    }
}
